package reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * java的反射机制
 * 反射是java中的一个动态机制，它允许我们的实例化操作，调用方法。操作属性等操作从原来的
 * 编码确定转为在程序运行期确定。这大大的增强了程序的灵活性，但是同时也带来了更多的系统
 * 开销和较慢的运行效率
 * 因此反射不应当 在程序中过度应用于依赖。
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
      /*
         反射的第一步，了解类对象：Class的实例
         JVM中每个被加载的类都有且只有一个Class的实例化与之对应，要想通过反射在程序
         运行期间操作一个类的第一步就是获取该类的类对象。
         类对象可以获取到其表示的类的一切信息（类名，有哪些方法，属性，构造器等等）
         我们获取到这些信息就可以在运行期间进行相关操作了。
         获取一个类的类对象有下列方式
         1：类名.class
         Class  cls=String.class;
         Class  cls = int.class
         注：基本类型获取对象只有这种方式

         2：Class.forName(String className)

         3:ClassLoader类加载器方式加载

         第二和第三种比较灵活。
       */

        //获取String的类对象，通过该类对象了解string的相关信息
       // Class cls = String.class;
       // Class cls = ArrayList.class;

       // Class cls = Person.class;
       // Class cls=Class.forName("java.lang.String");
        //Class cls=Class.forName("java.util.ArrayList");
        //Class cls=Class.forName("reflect.Person");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入一个类名：");
        String line=scanner.nextLine();
        Class cls=Class.forName(line);



        String className = cls.getName();            //获取完全限定名：  包名+类名
        System.out.println("类名：" + className);
        className = cls.getSimpleName();             //获取类名
        System.out.println("类名：" + className);
        /**
         * Method[] getMethods()
         * 获取Class对象所表示的类的所有公开方法，包括从超类继承下来的。
         * 每一个Method实例表示一个具体的方法，可以通过它获取该方法的一切信息，比如
         * 方法名，参数列表，访问修饰符等。
         */
/*
      获取本类方法以及私有方法
 */
      //  Method[]methods= cls.getMethods();
        Method[]methods= cls.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    }
}

